package main

import (
	"fmt"
	"io/fs"
	"os"
	"path/filepath"
)

// FileService 封装文件相关业务逻辑
// 依赖于 fs.FS 及 Root 以便支持写入/删除

type FileService struct {
	fsys     fs.FS
	rootPath string // 绝对根路径，用于写入/删除
}

func NewFileService(fsys fs.FS, rootPath string) *FileService {
	return &FileService{fsys: fsys, rootPath: rootPath}
}

// ListDir 返回目录下所有条目
func (s *FileService) ListDir(rel string) ([]fs.DirEntry, error) {
	return fs.ReadDir(s.fsys, rel)
}

// GetFileContent 通过fs.FS只读获取文件内容
func (s *FileService) GetFileContent(rel string) ([]byte, error) {
	return fs.ReadFile(s.fsys, rel)
}

// GetFileInfo 通过fs.FS获取文件/目录信息
func (s *FileService) GetFileInfo(rel string) (fs.FileInfo, error) {
	return fs.Stat(s.fsys, rel)
}

// GetFile 返回文件的绝对路径（用于下载/展示）
func (s *FileService) GetFile(rel string) (string, error) {
	abs := filepath.Join(s.rootPath, filepath.Clean(rel))
	info, err := os.Stat(abs)
	if err != nil {
		return "", err
	}
	if info.IsDir() {
		return "", fmt.Errorf("不是文件")
	}
	return abs, nil
}

// AddFile 写入文件
func (s *FileService) AddFile(rel string, data []byte) error {
	abs := filepath.Join(s.rootPath, filepath.Clean(rel))
	return os.WriteFile(abs, data, 0644)
}

// DeleteFile 删除文件
func (s *FileService) DeleteFile(rel string) error {
	abs := filepath.Join(s.rootPath, filepath.Clean(rel))
	return os.Remove(abs)
}

// AddFolder 新建文件夹
func (s *FileService) AddFolder(rel string) error {
	abs := filepath.Join(s.rootPath, filepath.Clean(rel))
	return os.MkdirAll(abs, 0755)
}

// DeleteFolder 递归删除文件夹
func (s *FileService) DeleteFolder(rel string) error {
	abs := filepath.Join(s.rootPath, filepath.Clean(rel))
	return os.RemoveAll(abs)
}
